Apply upstream patch to fix empty dynamic menus.
authorRob Browning <rlb@defaultvalue.org>
Sun, 1 Nov 2009 20:36:30 +0000 (12:36 -0800)
committerRob Browning <rlb@defaultvalue.org>
Sun, 1 Nov 2009 20:36:30 +0000 (12:36 -0800)
debian/changelog
debian/patches/fix-dynamic-menus.diff [new file with mode: 0644]
debian/patches/series

index b320560482f11283e16c2fcc285e8a50050c7faa..adcfa8c972a797fc2468cfa5741b8d01f154f8ff 100644 (file)
@@ -1,3 +1,12 @@
+emacs23 (23.1+1-5) unstable; urgency=low
+
+  * Apply upstream patch to fix problem with GTK and dynamically
+    generated menus (which could be unexpectedly empty).  Thanks to
+    Baylis Shanks <bshanks3@hotmail.com> for the report.
+    (closes: 550541)
+
+ -- Rob Browning <rlb@defaultvalue.org>  Sun, 01 Nov 2009 10:00:58 -0800
+
 emacs23 (23.1+1-4) unstable; urgency=low
 
   * Remove redundant upstream emacs.desktop files from emacs23-common,
diff --git a/debian/patches/fix-dynamic-menus.diff b/debian/patches/fix-dynamic-menus.diff
new file mode 100644 (file)
index 0000000..e7f51dc
--- /dev/null
@@ -0,0 +1,199 @@
+* Emacs should properly render dynamically generated menus.
+  Patch: fix-dynamic-menus.diff
+  Originally-reported-by: Baylis Shanks <bshanks3@hotmail.com>
+  Date: Sat, 10 Oct 2009 22:15:05 UTC
+  Added-by: Rob Browning <rlb@defaultvalue.org>
+  Status: incorporated upstream
+  Bug: 550541
+
+  This Debian patch is taken from this upstream commit:
+
+    commit 3715ffe3e3b2c64d113bf26d94aab559f8559e83
+    Author: Jan Djärv <jan.h.d@swipnet.se>
+    Date:   Wed Sep 2 17:03:20 2009 +0000
+
+Index: b/src/ChangeLog
+===================================================================
+--- a/src/ChangeLog
++++ b/src/ChangeLog
+@@ -1,3 +1,19 @@
++2009-09-02  Jan Djärv  <jan.h.d@swipnet.se>
++
++      * xterm.h: Rename x_non_menubar_window_to_frame to
++      x_menubar_window_to_frame
++
++      * xterm.c: Remove declarations also in xterm.h
++      (XTmouse_position): Do not return valid positions
++      for clicks in the menubar and the toolbar for Gtk+.
++
++      * xfns.c (x_any_window_to_frame): Assume less about Gtk+ internals,
++      if the widget for the event has the same top level as a frame,
++      return the frame.
++      (x_menubar_window_to_frame): Detect menu bar even with Gtk+
++      internal windows, bug #4122.
++      (x_non_menubar_window_to_frame): Remove.
++
+ 2009-07-29  Chong Yidong  <cyd@stupidchicken.com>
+       * Version 23.1 released.
+Index: b/src/xfns.c
+===================================================================
+--- a/src/xfns.c
++++ b/src/xfns.c
+@@ -374,10 +374,7 @@
+ #ifdef USE_GTK
+               GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
+               if (gwdesc != 0
+-                  && (gwdesc == x->widget
+-                      || gwdesc == x->edit_widget
+-                      || gwdesc == x->vbox_widget
+-                      || gwdesc == x->menubar_widget))
++                  && gtk_widget_get_toplevel (gwdesc) == x->widget)
+                 found = f;
+ #else
+             if (wdesc == XtWindow (x->widget)
+@@ -398,54 +395,6 @@
+   return found;
+ }
+-/* Likewise, but exclude the menu bar widget.  */
+-
+-struct frame *
+-x_non_menubar_window_to_frame (dpyinfo, wdesc)
+-     struct x_display_info *dpyinfo;
+-     int wdesc;
+-{
+-  Lisp_Object tail, frame;
+-  struct frame *f;
+-  struct x_output *x;
+-
+-  if (wdesc == None) return 0;
+-
+-  for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
+-    {
+-      frame = XCAR (tail);
+-      if (!FRAMEP (frame))
+-        continue;
+-      f = XFRAME (frame);
+-      if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo)
+-      continue;
+-      x = f->output_data.x;
+-      /* This frame matches if the window is any of its widgets.  */
+-      if (x->hourglass_window == wdesc)
+-      return f;
+-      else if (x->widget)
+-      {
+-#ifdef USE_GTK
+-          GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
+-          if (gwdesc != 0
+-              && (gwdesc == x->widget
+-                  || gwdesc == x->edit_widget
+-                  || gwdesc == x->vbox_widget))
+-            return f;
+-#else
+-        if (wdesc == XtWindow (x->widget)
+-            || wdesc == XtWindow (x->column_widget)
+-            || wdesc == XtWindow (x->edit_widget))
+-          return f;
+-#endif
+-      }
+-      else if (FRAME_X_WINDOW (f) == wdesc)
+-      /* A tooltip frame.  */
+-      return f;
+-    }
+-  return 0;
+-}
+-
+ /* Likewise, but consider only the menu bar widget.  */
+ struct frame *
+@@ -473,15 +422,14 @@
+       if (x->menubar_widget)
+         {
+           GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
+-          int found = 0;
+-          BLOCK_INPUT;
++        /* This gives false positives, but the rectangle check in xterm.c
++           where this is called takes care of that.  */
+           if (gwdesc != 0
+               && (gwdesc == x->menubar_widget
+-                  || gtk_widget_get_parent (gwdesc) == x->menubar_widget))
+-            found = 1;
+-          UNBLOCK_INPUT;
+-          if (found) return f;
++                  || gtk_widget_is_ancestor (x->menubar_widget, gwdesc)
++                || gtk_widget_is_ancestor (gwdesc, x->menubar_widget)))
++            return f;
+         }
+ #else
+       if (x->menubar_widget
+Index: b/src/xterm.c
+===================================================================
+--- a/src/xterm.c
++++ b/src/xterm.c
+@@ -109,8 +109,6 @@
+ #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
+ extern void free_frame_menubar P_ ((struct frame *));
+-extern struct frame *x_menubar_window_to_frame P_ ((struct x_display_info *,
+-                                                  int));
+ #endif
+ #ifdef USE_X_TOOLKIT
+@@ -143,11 +141,6 @@
+ #endif /* USE_X_TOOLKIT */
+-#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
+-#define x_any_window_to_frame x_window_to_frame
+-#define x_top_window_to_frame x_window_to_frame
+-#endif
+-
+ #ifdef USE_X_TOOLKIT
+ #include "widget.h"
+ #ifndef XtNinitialState
+@@ -3915,7 +3908,14 @@
+               if (child == None || child == win)
+                 break;
+-
++#ifdef USE_GTK
++              /* We don't wan't to know the innermost window.  We
++                 want the edit window.  For non-Gtk+ the innermost
++                 window is the edit window.  For Gtk+ it might not
++                 be.  It might be the tool bar for example.  */
++              if (x_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win))
++                break;
++#endif
+               win = child;
+               parent_x = win_x;
+               parent_y = win_y;
+@@ -3932,8 +3932,14 @@
+              parent_{x,y} are invalid, but that's okay, because we'll
+              never use them in that case.)  */
++#ifdef USE_GTK
++          /* We don't wan't to know the innermost window.  We
++             want the edit window.  */
++          f1 = x_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win);
++#else
+           /* Is win one of our frames?  */
+           f1 = x_any_window_to_frame (FRAME_X_DISPLAY_INFO (*fp), win);
++#endif
+ #ifdef USE_X_TOOLKIT
+           /* If we end up with the menu bar window, say it's not
+Index: b/src/xterm.h
+===================================================================
+--- a/src/xterm.h
++++ b/src/xterm.h
+@@ -374,7 +374,7 @@
+ #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
+ extern struct frame *x_any_window_to_frame P_ ((struct x_display_info *, int));
+-extern struct frame *x_non_menubar_window_to_frame P_ ((struct x_display_info *, int));
++extern struct frame *x_menubar_window_to_frame P_ ((struct x_display_info *, int));
+ extern struct frame *x_top_window_to_frame P_ ((struct x_display_info *, int));
+ #endif
index 33504f65429c207340037afbeb900c0b7128ed0d..3db6e98787fc2c41ae8d1a02b8f90b4334042745 100644 (file)
@@ -9,4 +9,5 @@ version-mention-debian.diff
 look-for-news-to-find-etc.diff
 fix-flymake-xmlstarlet-invocation.diff
 fix-rmail-capitalized-month-names.diff
+fix-dynamic-menus.diff
 autofiles.diff